<?php
namespace Amis\form;
class InputFile extends FormItem
{
    public string $type = 'input-file';

    public function receiver(string $apiUrl = '')
    {
        $this->receiver = $apiUrl;
        return $this;
    }

    /**
     * @param string $accept 默认只支持纯文本，要支持其他类型，请配置此属性为文件后缀.xxx
     * @return $this
     */
    public function accept(string $accept = 'text/plain')
    {
        $this->accept = $accept;
        return $this;
    }

    /**
     * 将文件以base64的形式，赋值给当前组件
     * @param bool $asBase64
     * @return $this
     */
    public function asBase64(bool $asBase64 = false)
    {
        $this->asBase64 = $asBase64;
        return $this;
    }

    /**
     * 将文件以二进制的形式，赋值给当前组件
     * @param bool $asBlob
     * @return $this
     */
    public function asBlob(bool $asBlob = false)
    {
        $this->asBlob = $asBlob;
        return $this;
    }

    /**
     *    默认没有限制，当设置后，文件大小大于此值将不允许上传。单位为B
     * @param int $maxSize
     * @return $this
     */
    public function maxSize(int $maxSize)
    {
        $this->maxSize = $maxSize;
        return $this;
    }

    /**
     * 默认没有限制，当设置后，一次只允许上传指定数量文件。
     * @param int $maxLength
     * @return $this
     */
    public function maxLength(int $maxLength)
    {
        $this->maxLength = $maxLength;
        return $this;
    }

    /**
     * 是否多选。
     * @param bool $multiple
     * @return $this
     */
    public function multiple(bool $multiple = false)
    {
        $this->multiple = $multiple;
        return $this;
    }

    /**
     *    是否为拖拽上传
     * @param bool $drag
     * @return $this
     */
    public function drag(bool $drag = false)
    {
        $this->drag = $drag;
        return $this;
    }

    /**
     * 拼接值
     * @param bool $joinValues
     * @return $this
     */
    public function joinValues(bool $joinValues = true)
    {
        $this->joinValues = $joinValues;
        return $this;
    }

    /**
     *    提取值
     * @param bool $extractValue
     * @return $this
     */
    public function extractValue(bool $extractValue = false)
    {
        $this->extractValue = $extractValue;
        return $this;
    }

    /**
     *    拼接符
     * @param string $delimiter
     * @return $this
     */
    public function delimiter(string $delimiter = ',')
    {
        $this->delimiter = $delimiter;
        return $this;
    }

    /**
     * 否选择完就自动开始上传
     * @param bool $autoUpload
     * @return $this
     */
    public function autoUpload(bool $autoUpload = true)
    {
        $this->autoUpload = $autoUpload;
        return $this;
    }

    /**
     * 隐藏上传按钮
     * @param bool $hideUploadButton
     * @return $this
     */
    public function hideUploadButton(bool $hideUploadButton = false)
    {
        $this->hideUploadButton = $hideUploadButton;
        return $this;
    }

    /**
     * { init: '', pending: '等待上传', uploading: '上传中', error: '上传出错', uploaded: '已上传', ready: '' }
     * @param array $stateTextMap
     * @return $this
     */
    public function stateTextMap(array $stateTextMap)
    {
        $this->stateTextMap = $stateTextMap;
        return $this;
    }

    /**
     * 如果你不想自己存储，则可以忽略此属性。
     * @param string $stateTextMap
     * @return $this
     */
    public function fileField(string $stateTextMap = 'file')
    {
        $this->fileField = $stateTextMap;
        return $this;
    }

    /**
     * 接口返回哪个字段用来标识文件名
     * @param string $nameField
     * @return $this
     */
    public function nameField(string $nameField = 'name')
    {
        $this->nameField = $nameField;
        return $this;
    }

    /**
     * 文件的值用那个字段来标识。
     * @param string $valueField
     * @return $this
     */
    public function valueField(string $valueField = 'value')
    {
        $this->valueField = $valueField;
        return $this;
    }

    /**
     * 文件下载地址的字段名。
     * @param string $urlField
     * @return $this
     */
    public function urlField(string $urlField = 'url')
    {
        $this->urlField = $urlField;
        return $this;
    }

    /**
     *    上传按钮的文字
     * @param string $btnLabel
     * @return $this
     */
    public function btnLabel(string $btnLabel = '上传')
    {
        $this->btnLabel = $btnLabel;
        return $this;
    }

    /**
     * 默认显示文件路径的时候会支持直接下载，可以支持加前缀如：http://xx.dom/filename= ，如果不希望这样，可以把当前配置项设置为 false。
     * 1.1.6 版本开始支持 post:http://xxx.com/${value} 这种写法
     * @param string $downloadUrl
     * @return $this
     */
    public function downloadUrl(string $downloadUrl = '')
    {
        $this->downloadUrl = $downloadUrl;
        return $this;
    }

    /**
     * amis 所在服务器，限制了文件上传大小不得超出 10M，所以 amis 在用户选择大文件的时候，自动会改成分块上传模式。
     * @param string $useChunk
     * @return $this
     */
    public function useChunk(string $useChunk = 'auto')
    {
        $this->useChunk = $useChunk;
        return $this;
    }

    /**
     * 分块大小
     * @param string $chunkSize
     * @return $this
     */
    public function chunkSize(string $chunkSize = '5 * 1024 * 1024')
    {
        $this->chunkSize = $chunkSize;
        return $this;
    }

    /**
     * startChunkApi
     * 用来做分块前的准备工作，一个文件只会调用一次。如果出错了，后续的分块上传就会中断。
     *
     * 发送说明：默认是 post，发送的数据中会包含 filename 字段，记录文件名，默认的数据体格式为 json。可以额外配置参数，请参考 API 的配置说明。
     *
     * 要求返回的数据中必须包含：
     *
     * uploadId 这次上传的唯一 ID。
     * key 有点类似 uploadId，可有可无，爱速搭中用来记录后端文件存储路径。
     * 其他属性返回目前是没有任何作用的。
     * @param string $startChunkApi
     * @return $this
     */
    public function startChunkApi(string $startChunkApi = '')
    {
        $this->startChunkApi = $startChunkApi;
        return $this;
    }

    /**
     * hunkApi
     * 用来接收每个分块上传，大文件会根据 chunkSize 分割成多块，然后每块上传都会调用这个接口。
     *
     * 发送说明：默认为 post，发送体格式为 form-data。包含以下信息：
     *
     * uploadId startChunkApi 返回的
     * key startChunkApi 返回的
     * partNumber 分块序号，从 1 开始。
     * partSize 分块大小
     * file 文件体
     * 要求返回的数据中必须包含:
     *
     * eTag 通常为文件的内容戳。
     * @param string $chunkApi
     * @return $this
     */
    public function chunkApi(string $chunkApi = '')
    {
        $this->chunkApi = $chunkApi;
        return $this;
    }

    /**
     * 等所有分块上传完后，将上传文件收集到的 eTag 信息合并一起，再次请求后端完成文件上传。
     *
     * 发送说明：默认为 post，数据体默认为 json，包含以下信息
     *
     * filename 文件名
     * key startChunkApi 返回的
     * uploadId startChunkApi 返回的
     * partList 数组，每个成员为 {partNumber: xxx, eTag: "xxxxx"} 即分块编号和分块 eTag 信息。
     * 数据返回，类似单文件上传一样，必须有 value 属性，可选返回 url 用来决定文件的下载地址。
     * @param string $finishChunkApi
     * @return $this
     */
    public function finishChunkApi(string $finishChunkApi = '')
    {
        $this->finishChunkApi = $finishChunkApi;
        return $this;
    }

    /**
     * 分块上传时并行个数
     * @param int $concurrency
     * @return $this
     */
    public function concurrency(int $concurrency)
    {
        $this->concurrency = $concurrency;
        return $this;
    }
}